package com.feisystems.provider.web.config.di;
import java.io.IOException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.hibernate4.HibernateTransactionManager;
import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import com.feisystems.provider.domain.Provider;
import com.feisystems.provider.domain.repository.RepositoryBasePackageMarker;
@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory", transactionManagerRef = "transactionManager", basePackageClasses = {RepositoryBasePackageMarker.class} )
public class DataAccessConfig{
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Value("${database.driverClassName}")
private String databaseDriverClassName;
@Value("${database.url}")
private String databaseUrl;
@Value("${database.username}")
private String databaseUsername;
@Value("${database.password}")
private String databasePassword;
@Bean
public DataSource dataSource(){
BasicDataSource dataSource =new BasicDataSource();
logger.debug("database.driverClassName " + databaseDriverClassName);
logger.debug("database.url " + databaseUrl);
logger.debug("database.username " + databaseUsername);
dataSource.setDriverClassName(databaseDriverClassName);
dataSource.setUrl(databaseUrl);
dataSource.setUsername(databaseUsername);
dataSource.setPassword(databasePassword);
dataSource.setTestOnBorrow(true);
dataSource.setTestOnReturn(true);
dataSource.setTestWhileIdle(true);
dataSource.setTimeBetweenEvictionRunsMillis(1800000);
dataSource.setNumTestsPerEvictionRun(3);
dataSource.setMinEvictableIdleTimeMillis(1800000);
dataSource.setValidationQuery("SELECT 1");
return dataSource;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
return hibernateJpaVendorAdapter;
}
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSource());
entityManagerFactory.setPackagesToScan("com.feisystems.provider.domain");
entityManagerFactory.setJpaVendorAdapter(jpaVendorAdapter());
java.util.Map<String, Object> jpaPropertyMap = entityManagerFactory
.getJpaPropertyMap();
jpaPropertyMap.put("hibernate.dialect",
"org.hibernate.dialect.MySQL5InnoDBDialect");
jpaPropertyMap.put("hibernate.max_fetch_depth", 3);
jpaPropertyMap.put("hibernate.jdbc.fetch_size", 50);
jpaPropertyMap.put("hibernate.jdbc.batch_size", 10);
jpaPropertyMap.put("hibernate.show_sql", true);
entityManagerFactory.setJpaPropertyMap(jpaPropertyMap);
return entityManagerFactory;
}
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager() throws IOException {
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory());
return transactionManager;
}
@Bean
public SessionFactory sessionFactory() throws IOException {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setAnnotatedClasses(new Class[] { Provider.class });
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.show_sql", true);
hibernateProperties.put("hibernate.format_sql", true);
hibernateProperties.put("hibernate.dialect",
"org.hibernate.dialect.MySQL5InnoDBDialect");
sessionFactory.setHibernateProperties(hibernateProperties);
sessionFactory.setDataSource(dataSource());
sessionFactory.afterPropertiesSet();
return sessionFactory.getObject();
}
}